import dayJs from 'dayjs' // 插件文档地址：https://dayjs.fenxianglu.cn/
import quarterOfYear from 'dayjs/plugin/quarterOfYear'

dayJs.extend(quarterOfYear)
/**
 * @description: 时间format
 * @param {时间格式化类型} type：默认时间到秒，可传参数 年 / 年月 / 年月日 / 年月日时 / 年月日时分
 * @return {*}
 */
export const formatStr = (type) => {
  let str = ''
  switch (type) {
    case '年':
      str = 'YYYY'
      break
    case '年月':
      str = 'YYYY-MM'
      break
    case '年月日':
      str = 'YYYY-MM-DD'
      break
    case '年月日时':
      str = 'YYYY-MM-DD HH'
      break
    case '年月日时分':
      str = 'YYYY-MM-DD HH:mm'
      break
    default:
      str = 'YYYY-MM-DD HH:mm:ss'
      break
  }
  return str
}
/**
 * @description:element时间format
 * @param {时间格式化类型} type：默认时间到秒，可传参数 年 / 年月 / 年月日 / 年月日时 / 年月日时分
 * @return {*}
 */
export const elFormatStr = (type) => {
  let str = ''
  switch (type) {
    case '年':
      str = 'yyyy'
      break
    case '年月':
      str = 'yyyy-MM'
      break
    case '年月日':
      str = 'yyyy-MM-dd'
      break
    case '年月日时':
      str = 'yyyy-MM-dd HH'
      break
    case '年月日时分':
      str = 'yyyy-MM-dd HH:mm'
      break
    default:
      str = 'yyyy-MM-dd HH:mm:ss'
      break
  }
  return str
}
/**
 * @description: 格式化传入时间
 * @param {时间}  time：传入时间
 * @param {时间格式化类型}  type：默认时间到秒，可传参数 年 / 年月 / 年月日 / 年月日时 / 年月日时分
 * @return {*}
 */
export const formatTime = (time, type) => {
  return dayJs(time).format(formatStr(type))
}
/**
 * @description: 获取当前时间
 * @param {时间格式化类型}  type：默认时间到秒，可传参数 年 / 年月 / 年月日 / 年月日时 / 年月日时分
 * @return {*}
 */
export const currentTime = (type) => {
  return dayJs().format(formatStr(type))
}
/**
 * @description: 获取之前的某个时间段
 * @param {时间格式化类型} type：默认时间到秒，可传参数 年 / 年月 / 年月日 / 年月日时 / 年月日时分
 * @param {往前推送的数值} prevNum：传阿拉伯数字
 * @param {往前推送的类型} prevType：可参考https://dayjs.fenxianglu.cn/category/manipulate.html#%E5%A2%9E%E5%8A%A0单位列表
 * @param {指定时间/当前时间} time：默认是当前时间，时间可传
 * @return {*}
 */
export const prevTime = (type, prevNum, prevType, time = new Date()) => {
  return dayJs(time).subtract(prevNum, prevType).format(formatStr(type))
}
/**
 * @description: 获取之后的某个时间段
 * @param {时间格式化类型} type：默认时间到秒，可传参数 年 / 年月 / 年月日 / 年月日时 / 年月日时分
 * @param {往前推送的数值} nextNum：传阿拉伯数字
 * @param {往前推送的类型} nextType：可参考https://dayjs.fenxianglu.cn/category/manipulate.html#%E5%A2%9E%E5%8A%A0单位列表
 * @param {指定时间/当前时间} time：默认是当前时间，时间可传
 * @return {*}
 */
export const nextTime = (type, nextNum, nextType, time = new Date()) => {
  return dayJs(time).add(nextNum, nextType).format(formatStr(type))
}
/**
 * @description: 获取时间在那个季度
 * @param {指定时间/当前时间} time：默认是当时时间，时间可传
 * @return {*} 返回参数是数字
 */
export const timeInQuarter = (time = new Date()) => {
  return dayJs(time).quarter()
}
/**
 * @description: 获取指定时间/当前时间的开始： 年份 / 月份 / 日期
 * @param {时间格式化类型} type：默认时间到秒，可传参数 年 / 年月 / 年月日 / 年月日时 / 年月日时分
 * @param {类型} startType：可参考https://dayjs.fenxianglu.cn/category/manipulate.html#%E6%97%B6%E9%97%B4%E7%9A%84%E5%BC%80%E5%A7%8B单位列表
 * @param {指定时间/当前时间} time：默认是当前时间，时间可传
 * @return {*}
 */
export const timeStartof = (type, startType, time = new Date()) => {
  return dayJs(time).startOf(startType).format(formatStr(type))
}
/**
 * @description: 获取指定时间/当前时间时间的结束： 年份 / 月份 / 日期
 * @param {时间格式化类型} type：默认时间到秒，可传参数 年 / 年月 / 年月日 / 年月日时 / 年月日时分
 * @param {类型} startType：可参考https://dayjs.fenxianglu.cn/category/manipulate.html#%E6%97%B6%E9%97%B4%E7%9A%84%E5%BC%80%E5%A7%8B单位列表
 * @param {指定时间/当前时间} time：默认是当前时间，时间可传
 * @return {*}
 */
export const timeEndof = (type, endType, time = new Date()) => {
  return dayJs(time).endOf(endType).format(formatStr(type))
}
/**
 * @description:获取第几季度的开始时间/结束时间
 * @param {时间格式化类型} type：默认时间到秒，可传参数 年 / 年月 / 年月日 / 年月日时 / 年月日时分
 * @param {季度的数字} num：可传 1 / 2 / 3 / 4
 * @return {*}
 */
export const quarterTime = (type, num) => {
  return {
    start: dayJs().quarter(num).startOf('quarter').format(formatStr(type)),
    end: dayJs().quarter(num).endOf('quarter').format(formatStr(type))
  }
}
/**
 * @description: 获取指定时间/当前时间上几个季度的开始时间/结束时间
 * @param {时间格式化类型} type：默认时间到秒，可传参数 年 / 年月 / 年月日 / 年月日时 / 年月日时分
 * @param {季度的数字} num：传数字，例如：传1就是上季度，传2就是上上季度，以此类推
 * @param {指定时间/当前时间} time：默认是当前时间，时间可传
 * @return {*}
 */
export const prevQuarterTime = (type, num, time = new Date()) => {
  return {
    start: dayJs(time).subtract(num, 'quarter').startOf('quarter').format(formatStr(type)),
    end: dayJs(time).subtract(num, 'quarter').endOf('quarter').format(formatStr(type))
  }
}
/**
 * @description: 获取指定时间/当前时间下几个季度的开始时间/结束时间
 * @param {时间格式化类型} type：默认时间到秒，可传参数 年 / 年月 / 年月日 / 年月日时 / 年月日时分
 * @param {季度的数字} num：传数字，例如：传1就是下季度，传2就是下下季度，以此类推
 * @param {指定时间/当前时间} time：默认是当前时间，时间可传
 * @return {*}
 */
export const nextQuarterTime = (type, num, time = new Date()) => {
  return {
    start: dayJs(time).add(num, 'quarter').startOf('quarter').format(formatStr(type)),
    end: dayJs(time).add(num, 'quarter').endOf('quarter').format(formatStr(type))
  }
}
/**
 * @description: element时间区间组件季度数据获取
 * @param {时间格式化类型} type：默认时间到秒，可传参数 年 / 年月 / 年月日 / 年月日时 / 年月日时分
 * @param {季度类型} quarter：可传：第一季度 / 第二季度 / 第三季度 / 第四季度 / 本季度 / 上季度 / 下季度
 * @return {*}
 */
export const elQuarterTime = (type, quarter) => {
  let strObj = {}
  switch (quarter) {
    case '第一季度':
      strObj = {
        start: quarterTime(type, 1).start,
        end: quarterTime(type, 1).end
      }
      break
    case '第二季度':
      strObj = {
        start: quarterTime(type, 2).start,
        end: quarterTime(type, 2).end
      }
      break
    case '第三季度':
      strObj = {
        start: quarterTime(type, 3).start,
        end: quarterTime(type, 3).end
      }
      break
    case '第四季度':
      strObj = {
        start: quarterTime(type, 4).start,
        end: quarterTime(type, 4).end
      }
      break
    case '本季度':
      strObj = {
        start: timeStartof(type, currentTime(), 'quarter'),
        end: timeEndof(type, currentTime(), 'quarter')
      }
      break
    case '上季度':
      strObj = {
        start: prevQuarterTime(type, 1).start,
        end: prevQuarterTime(type, 1).end
      }
      break
    case '下季度':
      strObj = {
        start: nextQuarterTime(type, 1).start,
        end: nextQuarterTime(type, 1).end
      }
      break
  }
  return strObj
}
/**
 * @description:获取日期是星期几
 * @param {时间格式化类型} format：可传 dd / ddd / dddd
 * @param {指定时间/当前时间} time：默认是当前时间，时间可传
 * @return {*}
 */
export const timeInWeek = (format = 'dddd', time = new Date()) => {
  const weekNum = dayJs(time).day()
  return dayJs().day(weekNum).format(format)
}
